/*******************************************************************************/
#ifndef __SYSTEM_H
#define __SYSTEM_H

//----------------------------------------------------------------------------------
#include "stdint.h"
// #include "iwdg.h"

#define SERVER_DEFAULT_IP "control.cssoc.com"
#define SERVER_DEFAULT_PORT 9802

// EEPROM
#define UPDATA_FIRST_ADDR 0x20  // 程序升级首地址（升级标志）
#define LOADING_FIRST_ADDR 0X40 // 程序加载首地址（读设置参数）
// #define RAINFALL_SAVE_ADDR			0x1000			//采样数据加载首地址

// FLASH
#define RAIN_SAVE_ADDR 1024 * 1024 * 1 // 1M首地址
// #define RAIN_SAVE_ADDR_END  1024*1024*2//
#define LEVEL_SAVE_ADDR 1024 * 1024 * 2               // 2M首地址
#define FLOW_SAVE_ADDR 1024 * 1024 * 3                // 3M首地址
#define RATE_SAVE_ADDR 1024 * 1024 * 3 + 4096         // 流速首地址
#define DEPTH_SAVE_ADDR 1024 * 1024 * 3 + 4096 * 2    // 深度首地址
#define SHUIWEN_SAVE_ADDR 1024 * 1024 * 3 + 4096 * 3  // 水温首地址
#define ZHUODU_SAVE_ADDR 1024 * 1024 * 3 + 4096 * 4   // 浊度首地址
#define YANDU_SAVE_ADDR 1024 * 1024 * 3 + 4096 * 5    // 盐度首地址

#define DIANDAO_SAVE_ADDR 1024 * 1024 * 3 + 4096 * 6  // 电导率首地址
#define UNSENDGW_SAVE_ADDR 1024 * 1024 * 3 + 4096 * 7 // 网关未发送时间戳首地址

#define DEFAULT_SEND_DATA_TIMER 600 // 发送时间间隔默认10分钟
#define DEFAULT_GET_DATA_TIMER 300
#define DEFAULT_SAVE_DATA_TIMER 300
#define DEFAULT_BEEPTIMER 10
#define DEFAULT_TEMPALARM 60
#define DEFAULT_REAMIN_ALARM 2000

/*****************************Equipment Version Paramter*******************************************/

#define EQU_HW_VERSION "2V1"

#define EQU_SW_VERSION "Gate"
#define EQU_PROTOCOL "ShengB_SW"

// extern char softVersion[32];



typedef struct
{
    char equ_hw_ver[20];
    char equ_sw_ver[20];
    char equ_type[30];
    char equ_brand[20];
    char equ_protocol[20];
} equ_info;


// 报警种类参考<水文监测数据通信规约6.6.4.20>
typedef enum
{
    ALARM_AC_POWER_CUT = 0x0001,     // 交流电充电状态(停电)
    ALARM_BATTERY_VOLTAGE = 0x0002,  // 蓄电池电压报警(电压低)
    ALARM_LEVEL_OVERRUM = 0x0004,    // 水位超限报警
    ALARM_YIELD_OVERRUM = 0x0008,    // 流量超限报警
    ALARM_QUANTITY_OVERRUM = 0x0010, // 水质超限报警
    ALARM_FLOW_METER = 0x0020,       // 流量仪表故障报警	(没采到或仪表报警)
    ALAMR_LEVEL_METER = 0x0040,      // 水位仪表故障报警
    ALARM_TERMINAL_GATE = 0x0080,    // 终端箱门状态
    ALARM_STORE_STATUS = 0x0100,     // 存储器状态
    ALAMR_IC_CARD = 0x0200,          // IC卡功能报警
    ALARM_BUMP_VALUE = 0x0400,       // 水泵工作状态
    ALARM_REMIAN_WATER = 0x0800,     // 剩余水量报警
} _enumAlarmSpecies;                 // 4// 4字节，12-31预留

/****************************************终端设备状态start***********************************/
// IC卡功能
typedef enum
{
    IC_DISBALE = 0x00, // IC卡功能关闭
    IC_ENABLE = 0x01,  // IC卡开启
} _enumICFunction;

// 定值控制空能
typedef enum
{
    DEFINITE_VALUE_DISABLE = 0x00, // 定值控制功能开启
    DEFINITE_VALUE_ENABLE = 0xff,  // 定值控制功能关闭
} _enumDefiniteValue;
/****************************************终端设备状态end***********************************/

/****************************************事件记录start***************************************/
typedef enum
{
    EVENT_DATA_INITIAL = 0,          // 数据初始化记录
    EVENT_PARAMETER_CHANGE = 1,      // 参数变更记录
    EVENT_STATE_CHANG = 2,           // 状态量变位记录
    EVENT_METER_BREAK = 3,           // 仪表故障记录
    EVENT_PASSWARD_WRONG = 4,        // 密码错误记录
    EVENT_TERMIANAL_BREAK = 5,       // 终端故障记录
    EVENT_AC_LOSS = 6,               // 交流失电记录
    EVENT_LOW_VOLTAGE = 7,           // 蓄电池电压告警记录
    EVENT_TERMINAL_OPEN_ILLEGAL = 8, // 终端箱非法打开记录
    EVENT_BUMP_BREAK = 9,            // 水泵故障记录
    EVENT_REMAIN_WATER_ALARM = 10,   // 剩余水量越限告警记录
    EVENT_WATER_LEVEL_ALARM = 11,    // 水位超限告警
    EVENT_WATER_PRESS_ALARM = 12,    // 水压超限告警
    EVENT_WATER_QUANTITY_ALARM = 13, // 水质参数超限告警记录
    EVENT_DATA_MISTAKE = 14,         // 数据出错记录
    EVENT_DATA_SEND = 15,            // 发报文记录
    EVENT_DATA_RECV = 16,            // 收报文记录
    EVENT_DATA_SEND_MISTAKE = 17,    // 发报文出错记录
} _enumEventReport;
/****************************************事件记录end***************************************/

/*****************************Device Paramter*******************************************/
typedef enum
{
    funPress = 0,    // 流量计是否带压力参数,0:不带,1:带
    funDCPower = 1,  // 是否直流供电,0:220V交流供电1:直流电源供电
    funStopMode = 2, // 是否进入停止模式.0:全速运行1:停止模式省电
    funSIM_IC = 3,   // 贴片卡还是插片卡.0:贴片卡1:插座卡
} _enumFuncFlag;

typedef struct
{
    uint8_t HardwareVer[15];  // 硬件版本
    uint8_t ProducBatch[15];  // 生产批次
    uint8_t functionFlag[15]; // 预留
    uint8_t PhraseVolDetect;  // 三项电压检测
    uint16_t resume3;         // 预留
} _structDevicePar;

/***************************服务器连接地址**********************/
/*****************************Server Paramter*******************************************/
typedef enum
{
    SERVER_CLOSE = 0,    // 关闭
    SERVER_COMPANY = 1,  // 公司协议
    SERVER_SHUILI = 2,   // 水利协议
    SERVER_SZY_DATA = 3, // 水资源协议
    SERVER_SW_DATA = 4,  // 水文协议
    SERVER_SZY_PIC = 5,  // 水资源图片(图片不通过报文发送到中心站，发送到公司网关，再通过ftp发送至中心站)
    SERVER_SW_PIC = 6,   // 水文图片
} _enumProtocolType;

typedef struct
{
    uint8_t isUse;  // 是否使用：1：使用该地址，0：不使用该地址
    uint8_t IP[32]; // 服务器地址
    uint16_t Port;  // 服务器端口
} _struLinkAddress;

typedef struct
{
    uint8_t AcquisitionType; // 采集数据种类
    uint8_t Channel;         // 采集通道：1:模拟量接采集通道1，2:模拟量接采集量2；
    uint8_t SubChannel;      // 子通道号	add by LMX,20180731
    uint8_t SensorType;      // 传感器类型
    uint8_t SensorBrand;     // 传感器品牌
    uint8_t Address[6];      // 485采集地址(不用485时，此项闲置)
    uint32_t Baudrate;       // 波特率
    float Range;             // 范围
    float Multiples;         // 放大倍数
    double TotalRain;        // 当天0点之前的累计雨量
} _struSensorPar;

typedef struct
{
    uint16_t KeepOnlineTimer; // 链路维持报时间间隔(单位:秒)
    uint16_t GetDataTimer;    // 采集数据时间间隔(单位：秒)
    uint16_t SaveDataTimer;   // 保存数据时间间隔(单位：秒)
    uint32_t SendDataTimer;   // 升级网管发送数据时间间隔(单位:秒)
} _struCommuniPar;

// 开关控制参数
typedef struct
{
    uint8_t IC_CardFunction;    // IC卡功能：置1为使能IC卡功能，清0为失能IC卡功能
    uint8_t FixedValueFunction; // 定值控制功能：置1为使能定值控制功能，清0为失能定值控制功能
    uint8_t GateNum;            // 闸门数量
    uint16_t GateStatus[4];     // 闸门状态
    uint16_t GateWide;          // 闸门开度数
    uint8_t PumpNum;            // 水泵字节数
    uint8_t PumpStatus[4];      // 水泵状态：置1为开水泵，置0为关水泵
    uint8_t ValveNum;           // 阀门字节数
    uint16_t ValveStatus[4];    // 阀门状态:置1表示开阀门，置0表示关阀门
} _struSwitchPar;

// 基本配置参数
typedef struct
{
    uint8_t CentreViceAddr[10]; // 中心站备用信道地址
    uint16_t CentreMainAddr;    // 中心站主信道地址
    int DeviceAddr;             // 测站地址(设备端)，给水文使用？？
} _struBasicPar;

/*****************************System Paramter*********************************************/
typedef struct
{
    uint8_t Mark;                // 标记系统数据是否效，没有被使用
    _structDevicePar DevicePar;  // 设备参数，没有被使用
    _struLinkAddress Server[6];  // 服务器参数，没有被使用
    _struSensorPar SensorPar[3]; // 传感器参数，用来保存uart配置，2个uart，给不支持通用协议设备使用
    _struCommuniPar CommuniPar;  // 通信参数，没有被使用
    _struBasicPar BasicPar;      // 基本配置参数，水文的？？
} _struSysPar;

extern _struSysPar SysSet;

void Show_EQU_Info(void);
void RCC_Configuration(void);
void SysTick_INIT(void);
void InitParam(void);
void ReadSysIni(void);
void SaveSysIni(void);
void ClearSysIni(void);
void Target_Init(void);
void App_Init(void);
void Touch(void);
void SetPowerUpTimeLength(uint8_t set_time);
void LCD_DisplayTempSignal(void);
void RTC_CheckPowerSouce(void);
// 20210304将main.h中数据拷贝到这-------------------------------------------------------------------------------------
#define UPDATE_CODE_ADDR 0x00001000 // 升级代码地址

#define FONT12ADDR 0x00096400 // 12号字体地址
#define FONT16ADDR 0x0012c400 // 16号字体地址

#define DESKTOP_PICTURES_ADDR 0x001F4800 // 桌面图片地址
#define BOOT_PICTURES_ADDR 0x001FE800    // 开机图片地址

#define HARDVER_DEFAULT 0x03 // 设备型号(03:竖板，软件版本的最高位为1，服务器有回复，最低位为1微信报警，次位为1电话报警；02: 都有应答)
#define HARDVER_1VB 0x04     // 1VB
#define HARDVER_1VC 0x05     // 1VC
#define HARDVER_2V1 0x20     // 水文新盒子

#define SOFTVER_DEFAULT 0x01    // 软件版本默认
#define SOFTVER_LOWPOWER 0x02   // 1VC低功耗
#define SOFTVER_KEEPHEART 0x03  // 长连接版本
#define SOFTVER_COMMON1 0x04    // 通用1(兼容公司、水利、国标协议)
#define SOFTVER_SWSZY 0x05      // 易彩水文&水资源&图片传输
#define SOFTVER_SB_GATEWAY 0x06 // 省标，1VB/C
#define SOFTVER_GB_GATEWAY 0x07 // 国标，1VB/C
#define SOFTVER_SB_2V1 0x21     // 省标，2V1

typedef enum
{
    SENSOR_BRAND_NONE = 0x00,
    SENSOR_BRAND_HY = 0x01,     // HanYan		汉妍
    SENSOR_BRAND_YN = 0x02,     // YiNuo		一诺
    SENSOR_BRAND_TX = 0x03,     // TianXin		天信
    SENSOR_BRAND_LMAG = 0x04,   // LMGA		虹益
    SENSOR_BRAND_MF30 = 0x05,   // MF30
    SENSOR_BRAND_FT8410 = 0x06, // FT8410
    SENSOR_BRAND_GH = 0x07,     // GuangHua	光华
    SENSOR_BRAND_KT = 0x08,     // KenTe		肯特
    SENSOR_BRAND_XF = 0x09,     // xiangFu		祥福(西门子)
    SENSOR_BRAND_JT = 0x0A,     // JinTian		金田
    SENSOR_BRAND_KB = 0x0B,     // KeBa		科霸
    SENSOR_BRAND_RH = 0x0C,     // RenHe		仁和(西门子)
    SENSOR_BRAND_NJ = 0x0D,     // NanJing		南京
    SENSOR_BRAND_XD = 0x0E,     // XunDa		迅达(无锡)
    SENSOR_BRAND_SD = 0x0F,     // ShanDong	山东
    SENSOR_BRAND_LA = 0x10,     // LinAn		临安
    SENSOR_BRAND_HX = 0x11,     // HenXin		恒信
    SENSOR_BRAND_AJ = 0x12,     // AnJun		安俊
    SENSOR_BRAND_2007 = 0x13,   // DianBiao2007	电表2007
    SENSOR_BRAND_YQ = 0x14,     // YueQiu		上海悦丘
    SENSOR_BRAND_HF = 0x15,     // HaiFeng		海峰
    SENSOR_BRAND_SM = 0x16,     // SongMao	嘉兴松茂
    SENSOR_BRAND_FUS080 = 0x17, // 西门子FUS080(只监听)
    SENSOR_BRAND_ZL = 0x18,     // ZhenLan		真兰
    SENSOR_BRAND_SY = 0x19,     // SaiYa		赛雅
    SENSOR_BRAND_WET = 0x1A,    // WeiErTai		威尔泰(WT4330)
    SENSOR_BRAND_KL = 0x1B,     // KeLong		科隆
    SENSOR_BRAND_KLT = 0x1C,    // KeLong		科隆(只监听)
    SENSOR_BRAND_XK = 0x1D,     // XingKong	星空
    SENSOR_BRAND_KD = 0x1E,     // KeDa		科大
    SENSOR_BRAND_KLT1 = 0x1F,   // KeLong		科隆1(只监听)
    SENSOR_BRAND_SB = 0x20,     // ShuiBiao		脉冲水表
    SENSOR_BRAND_MAG = 0x21,    // MAG 		西门子
    SENSOR_BRAND_LD = 0x22,     // LeiDa		雷达水位计
    SENSOR_BRAND_YP = 0x23,     // YuanPai		原牌热量表
    SENSOR_BRAND_13521C = 0x43, // DTSD13521C		导轨式三相电能表
    SENSOR_BRAND_MQ_SR = 0x4E,  // MingQu ShenRui		明渠(申瑞电力)    78
    SENSOR_BRAND_CSB_L = 0x4F,  // chaoshengbo		超声波液位计
    SENSOR_BRAND_HZ = 0x55,     // HangZheng	航征雷达
    SENSOR_BRAND_WYZ80 = 0x56,  // WYZ-80	压力水位计
    SENSOR_BRAND_ARGO = 0x57,   // Argonaut	深泰克
    SENSOR_BRAND_GLM = 0x5A,    // GeLeiMa   格雷码(气泡液位计协议与此相同)，90
    // SENSOR_BRAND_JBLD   = 111,   //精波雷达水位
    SENSOR_BRAND_JBLD = 180,                 // 精波雷达水位
    SENSOR_BRAND_RMD_YANDU = 181,            // 水质分析,盐度
    SENSOR_BRAND_RTIROWTECH_ADCPASCII = 182, // adcp,水位,流速
    SENSOR_BRAND_WFS_1 = 185,                // 磁致传感器
} _enumSensorBrand;

/*****************************Protocol Paramter*******************************************/
typedef struct
{
    uint8_t Edition[10];      // 版本号
    uint8_t CurrentCheckCode; // 当前校验值
    uint8_t EndCheckCode;     // 结束校验值
    uint16_t FileNumber;      // 文件号
    uint16_t SerialNumber;    // 序列号
    uint16_t TotalTimes;      // 总次数
    uint32_t ResidualByte;    // 剩余字节
    uint32_t FileSize;        // 文件大小
    uint32_t addr;            // 地址
    uint8_t FileName[40];     // 文件名
} _struProtocolPar;

// extern uint8_t  Device_ID[25];		//设备ID
// extern uint8_t imei_id[20];

/* Exported constants --------------------------------------------------------*/

#define VECTOR_TABLE 0x8000 // 0x8000向量表位置

#define DEVICE_TYPE 0x03      // 设备型号(03:竖板，软件版本的最高位为1，服务器有回复，最低位为1微信报警，次位为1电话报警；02: 都有应答)
#define SOFTWARE_VERSION 0x01 // 软件版本

#endif /* __SYSTEM_H */
